package com.coderush.admin.core.utils;

/**
 * 用户上下文持有者
 * <p>
 * 该类用于在当前线程中保存和获取登录用户的信息（UserDTO），利用 ThreadLocal 保证线程安全。
 * 通常在用户登录后将用户信息存入，后续业务逻辑可随时获取当前登录用户，
 * 请求处理结束后务必调用 removeUser() 清理数据，防止内存泄漏。
 * </p>
 *
 * @author YourName
 * @version 1.0
 * @since 2025-04-05
 */
public class UserContext {

    /**
     * ThreadLocal 变量，用于存储当前线程的用户信息（UserDTO）
     * <p>
     * 每个线程拥有独立的 UserDTO 副本，避免多线程环境下的数据冲突。
     * </p>
     */
    private static final ThreadLocal<UserContextModel> userThreadLocal = new ThreadLocal<>();

    /**
     * 将用户信息保存到当前线程的 ThreadLocal 中
     *
     * @param user 用户数据传输对象（UserDTO），通常包含用户ID、姓名、手机号等基本信息
     * @throws IllegalArgumentException 如果传入的 user 为 null，抛出非法参数异常
     */
    public static void saveUser(UserContextModel user) {
        if (user == null) {
            throw new IllegalArgumentException("用户信息不能为空");
        }
        userThreadLocal.set(user);
    }

    /**
     * 获取当前线程中存储的用户信息
     *
     * @return 当前登录的用户信息（UserDTO），若未设置则返回 null
     */
    public static UserContextModel getUser() {
        return userThreadLocal.get();
    }

    /**
     * 从当前线程中移除用户信息
     * <p>
     * 此方法应在请求处理结束时调用（例如在拦截器或过滤器中），
     * 避免因线程复用导致的用户信息错乱或内存泄漏。
     * </p>
     */
    public static void removeUser() {
        userThreadLocal.remove();
    }

    /**
     * 获取当前登录用户的ID
     * @return
     */
    public static Long getUserId() {
    	UserContextModel user = getUser();
    	if (user != null) {
    		return user.getUserId();
    	}
    	return 0L;
    }
}